import { MidwayConfig } from '@midwayjs/core';
import { busboyConfig } from '@config/busboy.config';
import { join } from 'path';
import * as os from 'os';
import * as axios from 'axios';
import { envConfig } from './index';
export default {
  // use for cookie sign key, should change to your own and keep security
  keys: 'xxx', // 自定义
  koa: {
    port: envConfig.PORT,
    bodyParser: {
      json: true,
      form: true,
      text: true,
      uploadDir: '/tmp', // 指定上传文件的临时目录
    },
  },
  validate: {
    enable: true,
    validationOptions: {
      allowUnknown: true, // 允许未定义的字段
      abortEarly: true,
      stripUnknown: true, // 剔除参数中的未定义属性
    },
  },
  jwt: {
    secret: 'xxx', // 自定义
    expiresIn: '2d', // 2天过期
  },
  multipart: {
    mode: 'file', // 文件上传模式
    fileSize: '50mb', // 文件大小限制
  },
  // 文件上传配置
  busboy: busboyConfig,
  // redis
  redis: {
    client: {
      host: 'localhost',
      port: 6379,
      password: '',
      db: 0,
    },
  },
  // 数据库
  typeorm: {
    dataSource: {
      default: {
        type: 'mysql',
        host: envConfig.DB_HOST,
        port: 3306,
        username: envConfig.DB_USERNAME,
        password: envConfig.DB_PASSWORD,
        database: envConfig.DB_DATABASE,
        // host: 'localhost',
        // port: 3306,
        // username: 'root',
        // password: 'root',
        // database: 'ruoyi_nodejs_open',
        synchronize: false,  // 如果第一次使用，不存在表，有同步的需求可以写 true，注意会丢数据
        logging: false,
        pool: {
          max: 10, // 最大连接数
          min: 2, // 最小连接数
          acquireTimeoutMillis: 30000, // 获取连接的超时时间
        },
        extra: {
          // 使用MySQL2支持的连接池配置
          connectionLimit: 10, // 最大连接数
          waitForConnections: true,  // 是否等待连接池中的空闲连接
          queueLimit: 5,  // 队列最大连接数
        },
        // 支持如下的扫描形式，为了兼容我们可以同时进行.js和.ts匹配，⬇️
        entities: [
          'entity',
        ],
        timezone: '+08:00', // 避免时间误差8小时
        dateStrings: true, // 时间字段返回字符串
        bigNumberStrings: false, // 避免大数字被截断转String类型
      }
    },
    // dataSource: {
    //   default: {
    //     type: 'postgres',
    //     host: 'localhost',
    //     port: 5432,
    //     username: 'postgres',
    //     password: 'root',
    //     database: 'ruoyi_nodejs_open',
    //     synchronize: false, // 生产环境务必关闭
    //     logging: true, // 开启日志，方便调试
    //     // 支持如下的扫描形式，为了兼容我们可以同时进行.js和.ts匹配，⬇️
    //     entities: [
    //       'entity',
    //     ],
    //     midwayFeature: {
    //       controllerAutoScan: false, // 让 Midway 自动扫描 controller
    //     },
    //     timezone: '+08:00', // 处理时区问题
    //     dateStrings: true, // 时间字段返回字符串
    //     bigNumberStrings: false, // 避免大数字被截断
    //     extra: {
    //       max: 20, // 连接池最大连接数
    //       min: 5, // 连接池最小连接数
    //       idleTimeoutMillis: 30000, // 空闲连接超时时间
    //     },
    //   },
    // },
  },
  // mqtt
  mqtt: {
    shanghai: {
      // 上海测试mqtt服务器
      host: envConfig.MQTT_SHANGHAI_HOST,
      port: 1883,                 // 默认 MQTT 端口
      username: '',   // 可选，MQTT 用户名
      password: '',   // 可选，MQTT 密码
      // clientId: 'mqttx_004b0661',   // 可选，MQTT 客户端ID
      clientId: '',
      keepalive: 60,              // 可选，保持连接的时间，单位：秒
      reconnectPeriod: 1000,      // 可选，重连时间间隔，单位：毫秒
    },
    suzhou: {
      // host: 'mqtt://broker.emqx.io',   // MQTT 服务器地址，改为你的地址
      host: envConfig.MQTT_SUZHOU_HOST,   // MQTT 服务器地址，改为你的地址
      port: 1883,                 // 默认 MQTT 端口
      username: '',   // 可选，MQTT 用户名
      password: '',   // 可选，MQTT 密码
      // clientId: 'mqttx_004b0661',   // 可选，MQTT 客户端ID
      clientId: '',
      keepalive: 60,              // 可选，保持连接的时间，单位：秒
      reconnectPeriod: 1000,      // 可选，重连时间间隔，单位：毫秒
    }
  },
  upload: {
    mode: 'file',
    fileSize: '50mb',
    whitelist: ['.bin', '.hex'], // 仅允许上传固件文件
    tmpdir: join(__dirname, '../upload/tmp'), // 临时目录
    cleanTimeout: 5 * 60 * 1000, // 5分钟后自动清理
    uploadDir: join(__dirname, '../upload'), // 上传目标目录
  },

  // 添加获取 IP 和时间的方法
  systemInfo: {
    getLocalIP: () => {
      const nets = os.networkInterfaces();
      for (const name of Object.keys(nets)) {
        for (const net of nets[name]) {
          if (net.family === 'IPv4' && !net.internal) {
            return net.address;
          }
        }
      }
      return 'Unable to determine local IP';
    },

    getPublicIP: async () => {
      try {
        const res = await axios.default.get(
          'https://api64.ipify.org?format=json'
        );
        return res.data.ip;
      } catch (error) {
        return 'Unable to determine public IP';
      }
    },

    getLocalTime: () => {
      return new Intl.DateTimeFormat('zh-CN', {
        timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
        dateStyle: 'full',
        timeStyle: 'long',
      }).format(new Date());
    },
  },
} as MidwayConfig;
